#ifndef __BLOBSBACK_H
  #define __BLOBSBACK_H 1
  
  #define OK 0
  #define ERR_COM_INVALIDO -1
  #define ERR_MOV_INVALIDO -2
  #define ERR_MANCHA_AJENA -3
  #define ERR_CELDA_OCUPADA -4
  #define ERR_FUERA_DEL_TABLERO -5
  #define ERR_ARCH_INEX -6
  #define ERR_IMP_WRITE -7
  #define ERR_IMP_LEER -8
  #define ERR_TAB_MAL_FORMADO -9
  #define ERR_ARCH_CORRUPTO -10
  #define ERR_NO_MEMORY	-11
  #define ERR_UNKNOWN -12

  #define DOSJUGADORES 1
  #define VSCPU 2
  #define CARGAR 3
  #define SALIR 4

  #define JUG1 0
  #define JUG2 1
  
  #define DIM_MIN 5
  #define ALTO_MAX 30
  #define ANCHO_MAX 50

  
  #define CHAR_J1 'A'
  #define CHAR_J2 'Z'
  #define CHARS_JUEGO "AZ0"
  #define CHAR_BLANK '0'
  #define CHAR_CENT 'X'
  #define CHAR_JUGADOR(a) (((a)==1)?CHAR_J1:(((a)==2)?CHAR_J2:-1)) //Retorna el caracter del jugador 

  #define ES_CENTINELA(i, j) ((j) < OFFSET_CENT || (i) < OFFSET_CENT || (j) >= ancho-OFFSET_CENT || (i) >= alto-OFFSET_CENT)
  
  #define ESTA_ENTRE(a, x, y) ((a) >= (x) && (a) <= (y))
  
  #define RANDOM_RANGE(range)   (int)((float)(range)*((float)rand()/((float)RAND_MAX+(float))))//(int)(((long)rand()*(range))/(((long)RAND_MAX)+1))
  
  #define OFFSET_CENT 2 //Factor de correccion por las centinelas
  
  #define INCONCLUSO -1
  
  #define SIN_VALOR -1
  
typedef struct {
  int x;
  int y;
} tPosicion;

typedef struct {
  tPosicion desde;
  tPosicion hasta;
} tMovimiento;

typedef struct {
  char** tablero;
  size_t ancho;
  size_t alto;
} tTablero;

typedef struct {
  int modo;
  int turno;
  size_t altoReal;
  size_t anchoReal;
  size_t cantManchas[2];
  tTablero * tablero;
} tDatosJuego;
  
tTablero * creaTablero (size_t alto, size_t ancho);
void liberaTablero (tTablero * tablero);
int analizaTablero(tDatosJuego * datosJuego);
int guardarJuego (tDatosJuego * datosJuego, FILE * archivo);
int cargarJuego (tDatosJuego * datosJuego, FILE * archivo);
int moverMancha(tMovimiento * movimiento, tTablero * tablero, size_t * cantManchas, int jugador);
int siguienteTurno(int turno);
int moverCpu(tTablero * tablero, int turno, tMovimiento * mov);
int randomBetween(int min, int max, int seed);

#endif
